<?php

    /**
    * A classe manipula arquivos XML que contem sentencas em
    * diversos idiomas
    */
    class Traducao
    {
        protected $mLingua = "";
        protected $mArquivo = "";
        protected $mDomDocument;

        /**
        *  Construtor da classe, abre o arquivo XML.
        *  @param string $arquivo Arquivo com as sentencas
        *  @param string $lingua  Idioma padrão utilizado para recuperar as sentencas
        */
        public function __construct( $arquivo , $lingua )
        {
            $this->mArquivo = $arquivo;
            $this->mLingua = $lingua;
            $this->reabre();
        }

        public function reabre()
        {
            if (file_exists($this->mArquivo))
            {
                libxml_use_internal_errors(true);
                $this->mDomDocument = new DOMDocument();
                $this->mDomDocument->preserveWhiteSpace=false;
                $this->mDomDocument->formatOutput = true;
                $this->mDomDocument->load($this->mArquivo);
                if (!$this->mDomDocument->schemaValidate("./linguas/translation.xsd"))
                    throw new Exception("O arquivo XML (".$this->mArquivo.") nao foi validado");
            }
            else
                throw new Exception("O arquivo XML (".$this->mArquivo.") nao existe");
        }


        private function htmlbuttags($str) {
            // Take all the html entities
            $caracteres = get_html_translation_table(HTML_ENTITIES);
            // Find out the "tags" entities
            $remover = get_html_translation_table(HTML_SPECIALCHARS);
            // Spit out the tags entities from the original table
            $caracteres = array_diff($caracteres, $remover);
            // Translate the string....
            $str = strtr($str, $caracteres);
            // And that's it!
            return $str;
        }

        /**
        * Pega a sentenca de id 'id' de acordo com o idioma configurado
        * @param string $id Identificador da sentenca
        */
        public function get ( $id )
        {
            $sentenca = $this->mDomDocument->getElementById( $id );
            if ($sentenca != NULL)
            {
                $traducoes = $sentenca->getElementsByTagname("traducao");
                foreach ($traducoes as $traducao)
                {
                    if ($traducao->getAttribute("xml:lang") == $this->mLingua)
                    {
                        //return htmlentities(utf8_decode($traducao->nodeValue));
                        return $this->htmlbuttags(utf8_decode($traducao->nodeValue));
                    }
                }
                throw new Exception("A traducao para o idioma selecionado nao foi encontrada");
            }
            throw new Exception("A sentenca '$id' nao foi encontrada");
        }

        /**
        * Retorna todas as traducoes da sentenca escolhida
        * @param string $id Identificador da sentenca
        */
        public function getsentenca($id)
        {
            $traducoes = array();
            $sentenca = $this->mDomDocument->getElementById($id);
            if ($sentenca != NULL)
            {
                $retorno = array();
                $retorno['id'] = $sentenca->getAttribute("xml:id");

                $linguas = $sentenca->getElementsByTagname("traducao");
                foreach ($linguas as $lingua)
                {
                    $idioma = $lingua->getAttribute("xml:lang");
                    $retorno[$idioma] = $lingua->nodeValue;
                }

                return $retorno;
            }
        }

        /**
        * Retorna todas as sentencas contidas no arquivo XML
        */
        public function getall($sentencasporpagina, $pagina)
        {
            $traducoes = array();
            $sentencas = $this->mDomDocument->getElementsByTagname("sentenca");
            $cont = 0;
            $inicio = $sentencasporpagina * $pagina;
            $fim = $sentencasporpagina * ($pagina + 1);
            if ($fim > $sentencas->length) $fim = $sentencas->length;
            for ($i = $inicio; $i < $fim; $i++)
            {
                $sentenca = array();
                $sentenca['id'] = $sentencas->item($i)->getAttribute("xml:id");

                $linguas = $sentencas->item($i)->getElementsByTagname("traducao");
                foreach ($linguas as $lingua)
                {
                    $idioma = $lingua->getAttribute("xml:lang");
                    $sentenca[$idioma] = $lingua->nodeValue;
                }

                $traducoes[$cont++] = $sentenca;
            }
            return $traducoes;
        }

        public function getqtdpaginas($sentencasporpagina)
        {
            $sentencas = $this->mDomDocument->getElementsByTagname("sentenca");
            return $sentencas->length / $sentencasporpagina; 
        }

        /**
        * Insere uma nova sentenca no arquivo de linguagem
        * @param string $id Identificador da sentenca
        * @param string $lingua Idioma da nova traducao
        * @param string $texto Texto da sentenca
        */
        public function insert ( $id , $lingua, $texto )
        {
            $sentenca = $this->mDomDocument->getElementById( $id );
            if ($sentenca == NULL)
            {
                $raiz = $this->mDomDocument->getElementsByTagname("strings");
                if ($raiz->length > 0)
                {
                    $sentenca = $this->mDomDocument->createElement("sentenca");
                    $sentenca = $raiz->item(0)->appendChild($sentenca);

                    $id = $sentenca->setAttribute("xml:id", $id);

                    $traducao = $this->mDomDocument->createElement("traducao");
                    $traducao = $sentenca->appendChild($traducao);

                    $traducao->nodeValue=$texto;

                    $lang = $traducao->setAttribute("xml:lang", $lingua);

                    $this->mDomDocument->save($this->mArquivo);
                }
            }
            else
            {
                $traducoes = $sentenca->getElementsByTagname("traducao");
                foreach ($traducoes as $traducao)
                {
                    if ($traducao->getAttribute("xml:lang") == $lingua)
                    {
                        throw new Exception("A traducao para o idioma ja existe");
                    }
                }

                $traducao = $this->mDomDocument->createElement("traducao");
                $traducao = $sentenca->appendChild($traducao);

                $traducao->nodeValue=$texto;

                $lang = $traducao->setAttribute("xml:lang", $lingua);

                $this->mDomDocument->save($this->mArquivo);
            }
        }

        /**
        * Altera uma sentenca ja existente no arquivo XML
        * @param string $id Identificador da sentenca
        * @param string $lingua Idioma da nova traducao
        * @param string $texto Texto da sentenca
        */
        public function set ( $id, $lingua, $texto )
        {
            $sentenca = $this->mDomDocument->getElementById( $id );
            if ($sentenca != NULL)
            {
                $traducoes = $sentenca->getElementsByTagname("traducao");
                foreach ($traducoes as $traducao)
                {
                    if ($traducao->getAttribute("xml:lang") == $lingua)
                    {
                        $traducao->nodeValue = $texto;
                        $this->mDomDocument->save($this->mArquivo);
                        return;
                    }
                }
                throw new Exception("Essa traducao ainda nao existe, utilize o metodo insert");
            }
            else
                throw new Exception("Essa sentenca ainda nao existe, utilize o metodo insert");
        }
        public function remove ( $id )
        {
            $sentenca = $this->mDomDocument->getElementById( $id );
            if ($sentenca != NULL)
            {
                $this->mDomDocument->getElementsByTagname("strings")->item(0)->removeChild($sentenca);
                $this->mDomDocument->save($this->mArquivo);
            }
            else
                throw new Exception ("Sentenca nao encontrada");
        }
    }
?>
